package com.jcj.jcjcache;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;

import java.util.List;

//ApplicationListener<ApplicationEvent> 是 Spring 框架中的一个核心接口，它用于监听和响应 Spring 应用程序中发布的事件。
// 在 Spring 的事件发布/订阅模型中，当某个事件发生时，Spring 容器会通知所有注册到该事件上的监听器（Listeners），并允许它们对事件做出响应。这个机制允许应用程序的不同部分之间实现松耦合的通信。

//ApplicationListener：这是一个泛型接口，用于定义事件监听器。通过实现这个接口，并指定监听的事件类型（即 ApplicationEvent 的子类），
// 开发者可以编写自定义的事件处理逻辑。当指定类型的事件被发布时，Spring 会自动调用监听器中定义的 onApplicationEvent 方法。

//注册监听器：Spring 容器会自动检测并注册实现了 ApplicationListener 接口的 bean。因此，通常只需将监听器类作为 Spring 组件（例如，使用 @Component 注解）进行声明即可。
@Component
public class JcjApplicationListener implements ApplicationListener<ApplicationEvent> {

    @Autowired
    List<JcjPlugin> plugins;

    //实现监听器：在 onApplicationEvent 方法中实现事件处理逻辑。
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ApplicationReadyEvent) {
            for (JcjPlugin plugin : plugins) {
                plugin.init();
                plugin.startup();
            }
        } else if (event instanceof ContextClosedEvent) {
            for (JcjPlugin plugin : plugins) {
                plugin.shutdown();
            }
        }
    }


    //发布事件：当需要通知监听器某个事件已经发生时，可以使用 ApplicationEventPublisher 接口的 publishEvent 方法来发布事件。ApplicationContext 接口继承自 ApplicationEventPublisher，
    //因此可以直接使用 ApplicationContext 实例来发布事件。
    //例如：applicationContext.publishEvent(customEvent);
}
